//+------------------------------------------------------------------+
//|                                                       String.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Object.h>

//+------------------------------------------------------------------+
//| 字符串类                                                         |
//| 用途：实现字符串功能                                              |
//|         继承自 CObject 类                                        |
//+------------------------------------------------------------------+
class CString : public CObject
{
protected:
   string            m_string;          // 字符串内容

public:
   /** 构造函数 */
   CString(void);
   
   /** 析构函数 */
   ~CString(void);
   
   /**
    * 获取字符串内容
    * @return 字符串值
    */
   string            Str(void) const;
   
   /**
    * 获取字符串长度
    * @return 字符串长度
    */
   uint              Len(void) const;
   
   /**
    * 复制字符串到目标字符串
    * @param copy 目标字符串
    */
   void              Copy(string &copy) const;
   
   /**
    * 复制字符串到另一个 CString 对象
    * @param copy 目标 CString 对象
    */
   void              Copy(CString *copy) const;
   
   /**
    * 填充字符串
    * @param character 填充字符
    * @return 成功返回 true，失败返回 false
    */
   bool              Fill(const short character);
   
   /**
    * 赋值字符串
    * @param str 源字符串
    */
   void              Assign(const string str);
   
   /**
    * 赋值另一个 CString 对象的内容
    * @param str 源 CString 对象
    */
   void              Assign(const CString *str);
   
   /**
    * 追加字符串
    * @param str 要追加的字符串
    */
   void              Append(const string str);
   
   /**
    * 追加另一个 CString 对象的内容
    * @param str 源 CString 对象
    */
   void              Append(const CString *str);
   
   /**
    * 在指定位置插入字符串
    * @param pos 插入位置
    * @param substring 要插入的字符串
    * @return 新字符串长度
    */
   uint              Insert(const uint pos, const string substring);
   
   /**
    * 在指定位置插入另一个 CString 对象的内容
    * @param pos 插入位置
    * @param substring 源 CString 对象
    * @return 新字符串长度
    */
   uint              Insert(const uint pos, const CString *substring);
   
   /**
    * 比较字符串（区分大小写）
    * @param str 要比较的字符串
    * @return 比较结果：-1（小于），0（等于），1（大于）
    */
   int               Compare(const string str) const;
   
   /**
    * 比较另一个 CString 对象的内容（区分大小写）
    * @param str 源 CString 对象
    * @return 比较结果：-1（小于），0（等于），1（大于）
    */
   int               Compare(const CString *str) const;
   
   /**
    * 比较字符串（不区分大小写）
    * @param str 要比较的字符串
    * @return 比较结果：-1（小于），0（等于），1（大于）
    */
   int               CompareNoCase(const string str) const;
   
   /**
    * 比较另一个 CString 对象的内容（不区分大小写）
    * @param str 源 CString 对象
    * @return 比较结果：-1（小于），0（等于），1（大于）
    */
   int               CompareNoCase(const CString *str) const;
   
   /**
    * 获取左侧子字符串
    * @param count 字符数量
    * @return 子字符串
    */
   string            Left(const uint count) const;
   
   /**
    * 获取右侧子字符串
    * @param count 字符数量
    * @return 子字符串
    */
   string            Right(const uint count) const;
   
   /**
    * 获取中间子字符串
    * @param pos 起始位置
    * @param count 字符数量
    * @return 子字符串
    */
   string            Mid(const uint pos, const uint count) const;
   
   /**
    * 去除两端指定字符
    * @param targets 要去除的字符集合
    * @return 去除的字符数量
    */
   int               Trim(const string targets);
   
   /**
    * 去除左侧指定字符
    * @param targets 要去除的字符集合
    * @return 去除的字符数量
    */
   int               TrimLeft(const string targets);
   
   /**
    * 去除右侧指定字符
    * @param targets 要去除的字符集合
    * @return 去除的字符数量
    */
   int               TrimRight(const string targets);
   
   /**
    * 清空字符串
    * @return 成功返回 true，失败返回 false
    */
   bool              Clear(void);
   
   /**
    * 转换为大写
    * @return 成功返回 true，失败返回 false
    */
   bool              ToUpper(void);
   
   /**
    * 转换为小写
    * @return 成功返回 true，失败返回 false
    */
   bool              ToLower(void);
   
   /**
    * 反转字符串
    */
   void              Reverse(void);
   
   /**
    * 查找子字符串
    * @param start 起始位置
    * @param substring 要查找的子字符串
    * @return 找到的位置索引，未找到返回 -1
    */
   int               Find(const uint start, const string substring) const;
   
   /**
    * 反向查找子字符串
    * @param substring 要查找的子字符串
    * @return 找到的位置索引，未找到返回 -1
    */
   int               FindRev(const string substring) const;
   
   /**
    * 移除所有匹配的子字符串
    * @param substring 要移除的子字符串
    * @return 移除的数量
    */
   uint              Remove(const string substring);
   
   /**
    * 替换所有匹配的子字符串
    * @param substring 要替换的子字符串
    * @param newstring 替换的新字符串
    * @return 替换的数量
    */
   uint              Replace(const string substring, const string newstring);

protected:
   /**
    * 比较对象（内部方法）
    * @param node 要比较的对象
    * @param mode 比较模式
    * @return 比较结果
    */
   virtual int       Compare(const CObject *node, const int mode = 0) const;
};
//+------------------------------------------------------------------+